package com.codemeta.bokit.mybatis.core.handler;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.codemeta.bokit.mybatis.core.kit.MybatisRequestHolder;
import java.time.LocalDateTime;
import java.util.Objects;
import org.apache.ibatis.reflection.MetaObject;

/**
 * mybatis-plus通用参数填充实现类
 * <p>
 * 如果没有显式的对通用参数进行赋值，这里会对通用参数进行填充、赋值
 *
 * @author hice
 */
public class DefaultMetaObjectHandler implements MetaObjectHandler {

    private final static String[] KEYS = new String[]{
        "createTime", "creator", "updateTime", "updater"
    };

    @Override
    public void insertFill(MetaObject meta) {
        if (Objects.nonNull(meta)) {
            if (Objects.isNull(getFieldValByName(KEYS[0], meta))) {
                // 创建时间为空，则以当前时间为插入时间
                strictInsertFill(meta, KEYS[0], LocalDateTime::now, LocalDateTime.class);
            }
            String username = MybatisRequestHolder.getUsername();
            if (Objects.nonNull(username) && Objects.isNull(getFieldValByName(KEYS[1], meta))) {
                // 当前登录用户不为空，创建人为空，则当前登录用户为创建人
                strictInsertFill(meta, KEYS[1], String.class, username);
            }
        }
    }

    @Override
    public void updateFill(MetaObject meta) {
        if (Objects.nonNull(meta)) {
            if (Objects.isNull(getFieldValByName(KEYS[2], meta))) {
                // 更新时间为空，则以当前时间为更新时间
                setFieldValByName(KEYS[2], LocalDateTime.now(), meta);
            }
            String username = MybatisRequestHolder.getUsername();
            if (Objects.nonNull(username) && Objects.isNull(getFieldValByName(KEYS[3], meta))) {
                // 当前登录用户不为空，更新人为空，则当前登录用户为更新人
                strictUpdateFill(meta, KEYS[3], String.class, username);
            }
        }
    }
}